package com.mtung.dubbo.handler;

import com.mtung.dubbo.req.RpcRequest;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;

import java.lang.reflect.Method;
import java.util.Map;

/**
 *
 * @author : zhenguo.yao
 * @date : 2020/3/23 0023 15:25
 */
public class DubboServerHandler extends ChannelInboundHandlerAdapter {

    /**
     * 从注册中心获取的提供者的信息
     */
    private Map<String,Object> handleMap;

    public DubboServerHandler(Map<String,Object> handleMap){
        this.handleMap = handleMap;
    }


    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        // 拿到客户端传来的消息,这里我们得到的是RpcRequest对象
        RpcRequest rpcRequest = (RpcRequest) msg;
        // 直接采用反射机制执行我们实现实现类的方法
        if (rpcRequest == null) {
            return;
        }
        System.out.println("服务器端获取到消息:" + rpcRequest.toString());
        final String className = rpcRequest.getClassName();
        final Object obj = handleMap.get(className);
        if(obj == null){
            return;
        }
        // 通过反射拿到对应的方法并执行方法,然后把结果再响应给客户端,这样就实现了远程调用本地方法
        final Method method = obj.getClass().getMethod(rpcRequest.getMethodName(), rpcRequest.getParameterTypes());
        final Object result = method.invoke(obj, rpcRequest.getParamsValue());
        // 返回结果
        System.out.println("服务器响应给客户端:" + result);
        ctx.writeAndFlush(result);
    }
}
